package com.semac.client.componentes.listafrequencia;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;

import com.google.gwt.core.client.GWT;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.Widget;
import com.semac.shared.model.Pessoa;
import com.semac.shared.model.Presenca;

public class PresencaTable extends Composite implements ValueChangeHandler<Boolean> {

	private static PresencaTableUiBinder uiBinder = GWT.create(PresencaTableUiBinder.class);
	private HashMap<CheckBox, Presenca> cruzamentoPresencaPorCheckBox = new HashMap<CheckBox, Presenca>();
	private HashMap<Presenca, CheckBox> cruzamentoCheckBoxPorPresenca = new HashMap<Presenca, CheckBox>();
	private LinkedList<Presenca> listaDePresenca = new LinkedList<Presenca>();
	
	private static String presente = "Presente";
	private static String nomeAluno = "Nome do aluno";
	
	
	@UiField FlexTable tabela;
	@UiField Label nenhuma;

	interface PresencaTableUiBinder extends UiBinder<Widget, PresencaTable> {
	}

	public PresencaTable() {
		initWidget(uiBinder.createAndBindUi(this));
		this.clear();
	}
	
	
	/**
	 * Adiciona uma inscricao de uma pessoa a lista
	 * @param presenca
	 */
	public void addInscrito(Presenca presenca){
		if (presenca != null)
			this.nenhuma.setVisible(false);
		
		CheckBox presente = new CheckBox();
		presente.addValueChangeHandler(this);
		presente.setValue(presenca.isPresente());
		listaDePresenca.add(presenca);
		this.cruzamentoCheckBoxPorPresenca.put(presenca, presente);
		this.cruzamentoPresencaPorCheckBox.put(presente, presenca);
		
		Integer rowCount = this.tabela.getRowCount();
		
		this.tabela.setWidget(rowCount, 0, presente);
		this.tabela.setText(rowCount, 1, presenca.getPessoa().getNome());
	}
	
	
	/**
	 * Popula a lista de chamada com uma lista de presencas
	 * @param presencas
	 */
	public void addListaDeInscritos(ArrayList<Presenca> presencas){
		if (presencas == null)
			return;
		for (Presenca presenca : presencas) {
			this.addInscrito(presenca);
		}
	}
		
	/**
	 * Limpa esta lista de chamada
	 */
	public void clear(){
		this.tabela.removeAllRows();
		this.cruzamentoCheckBoxPorPresenca.clear();
		this.cruzamentoPresencaPorCheckBox.clear();
		this.listaDePresenca.clear();
		this.nenhuma.setVisible(true);
		
		Label presencaLabel = new Label(presente);
		Label nomeAlunoLabel = new Label(nomeAluno);
		presencaLabel.setStyleName("button-grey-normal");
		
		nomeAlunoLabel.setStyleName("button-grey-normal");
		
//		this.tabela.setCellPadding(0);
//		this.tabela.setCellSpacing(1);
		
		this.tabela.setWidget(0, 0, presencaLabel);
		this.tabela.setWidget(0, 1, nomeAlunoLabel);		
	}


	
	
	public void setPessoaPresente(Pessoa pessoa){
		this.setPessoaPresente(pessoa.getCartaoUfrgs());
	}
	
	
	public void setPessoaPresente(Integer numeroCartao){
		if (numeroCartao == 0)
			return;
		for (Presenca presenca : this.listaDePresenca) {
			if(presenca.getPessoa().getCartaoUfrgs().equals(numeroCartao)){
				presenca.setPresente(true);
				this.cruzamentoCheckBoxPorPresenca.get(presenca).setValue(true);
				break;
			}
		}		
	}
	

	@Override
	public void onValueChange(ValueChangeEvent<Boolean> event) {
		Presenca presenca = this.cruzamentoPresencaPorCheckBox.get(event.getSource());
		presenca.setPresente(event.getValue());
		this.fireEvent(new PresencaEvent(presenca));
	}
	
	public HandlerRegistration addPresencaEventHandler( PresencaHandler handler) {
		return this.addHandler(handler, PresencaEvent.TYPE);
	}
	
	
}
